summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando S <fsahmkow27@gmail.com>2023-05-04 03:56:53 +0200
committerGitHub <noreply@github.com>2023-05-04 03:56:53 +0200
commit2506594c505c9b2b3949bbd34345677bcafe2cef (patch)
tree0714960a5cbe2e292df3f5bb6d9e8ac65fa5ce71
parentMerge pull request #10154 from liamwhite/optimistic (diff)
parentMemory manager: Fix possible softlock (diff)
downloadyuzu-2506594c505c9b2b3949bbd34345677bcafe2cef.tar
yuzu-2506594c505c9b2b3949bbd34345677bcafe2cef.tar.gz
yuzu-2506594c505c9b2b3949bbd34345677bcafe2cef.tar.bz2
yuzu-2506594c505c9b2b3949bbd34345677bcafe2cef.tar.lz
yuzu-2506594c505c9b2b3949bbd34345677bcafe2cef.tar.xz
yuzu-2506594c505c9b2b3949bbd34345677bcafe2cef.tar.zst
yuzu-2506594c505c9b2b3949bbd34345677bcafe2cef.zip
-rw-r--r--src/video_core/memory_manager.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index e06ce5d14..7b2cde7a7 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -82,6 +82,7 @@ void MemoryManager::SetEntry(size_t position, MemoryManager::EntryType entry) {
}
PTEKind MemoryManager::GetPageKind(GPUVAddr gpu_addr) const {
+ std::unique_lock<std::mutex> lock(guard);
return kind_map.GetValueAt(gpu_addr);
}
@@ -160,7 +161,10 @@ GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr
}
remaining_size -= big_page_size;
}
- kind_map.Map(gpu_addr, gpu_addr + size, kind);
+ {
+ std::unique_lock<std::mutex> lock(guard);
+ kind_map.Map(gpu_addr, gpu_addr + size, kind);
+ }
return gpu_addr;
}
@@ -170,7 +174,6 @@ void MemoryManager::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_)
GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size, PTEKind kind,
bool is_big_pages) {
- std::unique_lock<std::mutex> lock(guard);
if (is_big_pages) [[likely]] {
return BigPageTableOp<EntryType::Mapped>(gpu_addr, cpu_addr, size, kind);
}
@@ -178,7 +181,6 @@ GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size,
}
GPUVAddr MemoryManager::MapSparse(GPUVAddr gpu_addr, std::size_t size, bool is_big_pages) {
- std::unique_lock<std::mutex> lock(guard);
if (is_big_pages) [[likely]] {
return BigPageTableOp<EntryType::Reserved>(gpu_addr, 0, size, PTEKind::INVALID);
}
@@ -189,7 +191,6 @@ void MemoryManager::Unmap(GPUVAddr gpu_addr, std::size_t size) {
if (size == 0) {
return;
}
- std::unique_lock<std::mutex> lock(guard);
GetSubmappedRangeImpl<false>(gpu_addr, size, page_stash);
for (const auto& [map_addr, map_size] : page_stash) {